const http = require("http");
const fs = require("fs");
const url = require("url");
const qs = require("querystring");

// 路由设定
// 非静态资源（数据）：url内携带/api
// 不携带/api就是静态资源

http.createServer((req, res)=>{
    if(req.url.includes("/api")){
        // 数据响应
        dataMiddleware(req,res)
    }else{
        // 静态资源响应
        staticHandle(req,res);
    }
}).listen(3000);

function staticHandle(req,res){
    fs.readFile("./www" + req.url, (err, data)=>{
        if(err){
            res.write("404");
        }else{
            res.write(data);
        }
        res.end();
    })
}
function dataMiddleware(req,res){
    // 区分请求方式，并解析对应数据
    if(req.method === "GET"){
        // 解析get数据：数据在url后拼接
        const getData = url.parse(req.url, true).query;
        // 数据功能处理
        dataHandle(req,res,getData);
    }else if(req.method === "POST"){
        // 解析post数据：请求体，需要使用相关事件解析
        let str = "";
        // data:会被多次触发，每次只能拿到一个数据片段，需要提前准备容器，多次触发时拼接数据
        req.on("data", (d)=>{
            str += d;
        })
        // end:绝对会在最后一次data事件触发后再触发，当end事件触发时，data事件中拼接的数据，绝对已经完整了
        req.on("end", ()=>{
            // 解析请求体上的数据（post）
            const postData = qs.parse(str);
            // 数据功能处理
            dataHandle(req,res,postData);
        })
    }else{
        // 非约定的请求方式的处理
        errorHandle(res, 0);
        res.end();
    }
}

function dataHandle(req, res, reqData){
    // 数据功能处理：区分功能
    // console.log(reqData);
    switch(reqData.type){
        case "login":
            // 执行登录功能
            login(req, res, reqData);
            break;
        case "register":
            // 执行注册功能
            register(req, res, reqData);
            break;
        default:
            // 执行报错功能
            errorHandle(res, 1);
    }
}

// 准备存储用户信息
const userMsg = [];

// 登录功能
function login(req,res,reqData){
    let i=0;
    const flag = userMsg.some((val,idx)=>{
        i = idx;
        return val.username === reqData.username
    })
    if(flag){
        if(reqData.password === userMsg[i].password){
            res.write("登录成功");
            res.end();
        }else{
            res.write("登录失败，密码不对");
            res.end();
        }
    }else{
        res.write("用户名未注册");
        res.end();
    }
}

// 注册功能
function register(req,res,reqData){
    let i=0;
    const flag = userMsg.some((val,idx)=>{
        i = idx;
        return val.username === reqData.username
    })
    if(flag){
        res.write("用户名已存在");
        res.end();
    }else{
        userMsg.push({
            username:reqData.username,
            password:reqData.password
        })
        res.write("注册成功");
        res.end();
    }
}


function errorHandle(res, type){
    if(type === 0){
        res.write("接收到未知请求方式，无法处理，请检查")
    }else if(type === 1){
        res.write("接收到未知功能，无法处理，请检查")
    }
    res.end();
}

